﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main1()
{
	double r = sqrt(16);//求平方根
	printf("%lf\n", r);

	//double r = sqrt(-16);//当为负数时，结果有问题
	//printf("%lf\n", r);
	return 0;
}
//函数的定义
//int Add(int x, int y)//(交代参数的类型，变量名，个数）
//{
//	int z = 0;
//	z =x + y;
//	return z;//返回的是整型z ，是局部变量
//	//返回的时候，会先把z放到寄存器中，再返回给c
//}

//函数的定义（简化）
int Add(int x, int y)
{
	return x + y;
}//函数可以复用（多次调用）

int main3()
{
	/*举例：写一个加法函数，完成2个整型变量的加法操作
		1.有2个整型变量（两个参数）
		2.计算（函数体）
		3.算出一个和（计算的结果）*/
	int a = 0;
	int b = 0;
	//输入
	scanf("%d %d",&b,&b);
	//计算
	int c = Add(a, b);//使用（调用）函数
	//输出
	printf("%d\n",c);
	//如果最终没有返回正确的值，说明函数出了问题

	return 0;
}

//函数在设计的时候要不要带参数，
//会不会带返回值与他的功能有关
//不需要返回值的函数
//void print(void)//()里void可以不写，尽量写上
//{
//	printf("hello world\n");
//}
//int main()
//{
//	print();//不需要接收返回值，也不需要含参
//	return 0;
//}

//int test()
//{
//	int a = 0;
//	scanf("%d",&a);
//	if (a > 0)
//		return 1;
//	else
//		return -1;
//}
//int main()
//{
//	int ret = test();
//	printf("%d\n", ret);
//	return 0;
//}

//void test()
//{
//	printf("hahaha\n");
//	if (1)//非0为真
//	{
//		return;//提前结束方法
//	}
//	printf("hehehe");
//}
//int main()
//{
//	test();//输出结果为hahaha
//	return 0;
//}

//没写返回类型：函数默认返回整型
//如果函数要求返回值，但是函数中没有使用return
//返回值，则具体返回什么不确定
//test()
//{
//	printf("hehe\n");
//}
//int main()
//{
//	int c = test();
//	printf("%d\n", c);
//	return 0;
//}


//将数组作为参数传递给函数，在函数内部对数组进⾏操作
//1.写⼀个函数将⼀个整型数组的内容，全部置为-1，
// 再写⼀个函数打印数组的内容。
void set_arr(int arr[], int sz,int set)//返回值
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = set;
	}

}
void print_arr(int arr[],int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main6()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//              0,1,2,3,4,5,6,7,8,9
	//计算数组长度,sizeof算的是字节
	int sz = sizeof(arr) / sizeof(arr[0]);
	//全部置为1之前先打印一次
	print_arr(arr, sz);
	//写⼀个函数将⼀个整型数组的内容，全部置为-1，
	set_arr(arr,sz,-1);//数组作为函数，传数组名
	//(arr[10])的写法是错的，没有下标为10的元素，且表示一个
	//数，非数组名

	//打印数组的函数
	print_arr(arr, sz);
	
	return 0;
}
//1.数组在传参的时候，实参写数组名，形参也是数组的形式
// （arr[]或者例如arr[10]
//2.形参和实参的名字可以一样
//3.函数在设计的时候，最好功能单一
//4.形参若为一维数组，则[]内的值可以省略
//4.形参若为二维数组，则行可以省略，列不能省略

void print_a(int arr[][5], int a, int b)//行可以省略，列不能省略
{
	for (int i = 0; i < a; i++)//行
	{
		for (int j = 0; j < b; j++)//列
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");//打印完一行后就换行
	}
}

int main7()
{
	int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,11},{22,33,44,55,66} };
	print_a(arr, 3, 5);
	return 0;
}

//嵌套调用，链式访问
//例如：计算某年某⽉有多少天？用函数实现

//3.判断是否是闰年
//是（真）/不是（假） ，可用布尔类型
//is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//	{
//		return 1;
//	}
//	else
//		return 0;
//}
#include <stdbool.h>
bool is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
	{
		return true;
	}
	else
		return false;
}

//2.返回某年 某月的天数
int get_days_of_month(int y, int d)
{
	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		//         0 1  2  3  4  5  6  7  8  9 10  11 12
		//              29
    //闰年的二月有29天比平年多一天
	int day = days[d];
	//想知道某月的天数，访问下标
	if (is_leap_year(y) && d == 2)//1为真
	//判断闰年 是/不是
	//拿到下标后，如果是闰年，天数加1
	{
		day++;
	}
	return day;
}
//1.主函数
int main8()
{
	int year = 0, day = 0;
	scanf("%d %d", &year, &day);
	int days = get_days_of_month(year, day);
	printf("%d\n", days);
	return 0;
}

//链式访问
#include <string.h>
int main()
{
	//求字符串的长度
	/*int len = strlen("abcdef");
	printf("%d\n", len);*/
	printf("%d\n", strlen("abcdef"));
	//调用的时候，传参的参数部分使用了其它函数
	int r = printf("hehe");
	printf("%d", r);

	printf("%d", printf("%d", printf("%d", 43)));
// 打印1，返回1  打印2，返回1   打印43，返回2
//输出结果：43 2 1

	printf("%d", printf("%d ", printf("%d ", 43)));
	// 打印2，返回1  打印3 ，返回2   打印43 ，返回3
	//输出结果：43 3 2
	//空格也是字符

	return 0;
}
//printf打印本次函数调用的结果
//      返回值：打印几个字符，返回值就是几





